`timescale 1ns / 1ps
`include "defines.v"
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/11/09 18:58:21
// Design Name: 
// Module Name: ex
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module ex(
    input wire rst,
    //译码阶段送到执行阶段的信息
    input wire[`AluOpBus] aluop_i,
    input wire[`AluSelBus] alusel_i,
    input wire[`RegBus] reg1_i,//参与运算的源操作数1
    input wire[`RegBus] reg2_i,//参与运算的源操作数2
    input wire[`RegAddrBus] wd_i,//指令执行结果要写入的寄存器地址
    input wire wreg_i,//是否写入

    //执行的结果
    output reg[`RegAddrBus] wd_o,//执行阶段的指令最终要写入的目的寄存器地址
    output reg wreg_o,//是否写入
    output reg[`RegBus] wdata_o  //最终要写入的值
    );

    //保存逻辑运算的值
    reg[`RegBus] logicout;

    /********************依据aluop_i指示的运算子类型进行运算，这里只有‘或’运算********************/
    always @(*) begin
        if (rst == `RstEnable) begin
            logicout <= `ZeroWord;
        end
        else begin
            case (aluop_i)
                `EXE_OR_OP: begin
                    logicout <= reg1_i | reg2_i;
                end
                default: begin
                    logicout <= `ZeroWord;
                end
            endcase
        end
    end


    /*********************依据alusel_i指示的运算类型，选择一个运算结果作为最终结果*********************/
    always @(*) begin
        wd_o <= wd_i;
        wreg_o <= wreg_i;
        case (alusel_i)
            `EXE_RES_LOGIC: begin
                wdata_o <= logicout;
            end
            default: begin
                wdata_o <= logicout;
            end
        endcase
    end

endmodule
